﻿using BLevy.Datos.Interfases;
using BLevy.Entidad;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dapper;
using DapperExtensions;

namespace BLevy.Datos.Repositories
{
    public interface IEmpresaRepository : IRepository<Empresa>
    {
        Empresa FindDatos(string id);
    }

    public class EmpresaRepository : IEmpresaRepository
    {
        protected readonly IDbConnection _db;

        public EmpresaRepository()
        {
            try
            {
                _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString());
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public IList<Empresa> FindAll()
        {
            throw new NotImplementedException();
        }

        public IQueryable<Empresa> Find(System.Linq.Expressions.Expression<Func<Empresa, bool>> predicate)
        {
            throw new NotImplementedException();
        }

        public Empresa FindById(int id)
        {
            throw new NotImplementedException();
        }

        public int Add(Empresa newEntity)
        {
            const string query = "INSERT INTO EMPRESAS (ID, NOMBRE, RAZON_SOCIAL, CONDICION_IVA, CUIT, CALLE, NUMERACION, " +
            "PISO, DEPARTAMENTO, LOCALIDAD_ID, ZONA_ID, TELEFONO, EMAIL) VALUES (@id, @nombre, @razonsocial, @condicion_iva, " +
            "@cuit, @calle, @numeracion, @piso, @departamento, @localidad_id, @zona_id, @telefono, @email)";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new
                    {
                        id = newEntity.id,
                        nombre = newEntity.nombre,
                        razonsocial = newEntity.razon_social,
                        condicion_iva = newEntity.condicion_iva,
                        cuit = newEntity.cuit,
                        calle = newEntity.calle,
                        numeracion = newEntity.numeracion,
                        piso = newEntity.piso,
                        departamento = newEntity.departamento,
                        localidad_id = newEntity.localidad_id,
                        zona_id = newEntity.zona_id,
                        telefono = newEntity.telefono,
                        email = newEntity.email
                    });
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public int Remove(int id)
        {
            throw new NotImplementedException();
        }

        public int Modify(Empresa entity)
        {
            const string query = "UPDATE EMPRESAS SET NOMBRE = @nombre, RAZON_SOCIAL = @razonsocial, " +
                "CONDICION_IVA = @condicion_iva, CUIT = @cuit, CALLE = @calle, NUMERACION = @numeracion, " +
                "PISO = @piso, DEPARTAMENTO = @departamento, LOCALIDAD_ID = @localidad_id, ZONA_ID = @zona_id, " +
                "TELEFONO = @telefono, EMAIL = @email " +
                "WHERE ID = @id";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Execute(query, new
                    {
                        id = entity.id,
                        nombre = entity.nombre,
                        razonsocial = entity.razon_social,
                        condicion_iva = entity.condicion_iva,
                        cuit = entity.cuit,
                        calle = entity.calle,
                        numeracion = entity.numeracion,
                        piso = entity.piso,
                        departamento = entity.departamento,
                        localidad_id = entity.localidad_id,
                        zona_id = entity.zona_id,
                        telefono = entity.telefono,
                        email = entity.email
                    });
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }

        public Empresa FindDatos(string id)
        {
            const string query = "SELECT * FROM EMPRESAS " +
                "WHERE ID = @id";

            try
            {
                using (IDbConnection _db = new MySqlConnection(ConfigurationManager.ConnectionStrings["LEVYDB"].ToString()))
                {
                    return _db.Query<Empresa>(query, new { id = id }).SingleOrDefault();
                }
            }
            catch(Exception e)
            {
                throw e;
            }
        }
    }
}
